<?php
namespace Monkey;

use Exception;
use MonkeyException;

/**
 * 应用程序基类\Monkey\_App
 * @package    Monkey
 * @author     HuangYi
 * @copyright  Copyright (c) 2011-07-01——2013-03-30
 * @license    New BSD License
 * @version    $Id: \Monkey\_App.php 版本号 2013-03-30 $
 */
class _App
{
    //网站系统程序设置
    public $timezoneSet='PRC';//默认为东8区即北京时间
    public $osCharset='GB2312';//文件系统的字符集，linux用户请改成UTF8
    public $gzipAutoSet=true;//是否自动压缩输出到浏览器的内容（缓冲区中的内容）
    public $gzipLevelSet=6;//压缩级别
    public $labelSet='MonkeyLabel';//模板的标签方案选择，目前支持mk_label，你可以方便的添加并在这里启用你的方案
    public $defaultThemeSet='default';//默认的全局主题名
    public $allThemesSet=array('default');//默认的全局主题名
    public $entranceSet='index.php';//入口文件名
    public $defaultLanguageSet='zh-cn';//默认的全局主题名

    //session配置
    public $sessionSet=array(
        'type'=>'File',//选择session实现,默认为File、其次为Apc、Memcache，为空表示不使用MonkeyPHP提供的session管理器
        'expiry'=>'1440',//这是共有的设置，session过期时间
        /*mk_session_file专有设置（不用时请注释掉）*/
        'filename'      =>'data',
        'filesize'      =>'15M',
        /*使用memcache保存session则用如下配置方式
        'host'          =>'localhost',
        'port'          =>11211,
        'persistent'    =>'',
        'compressed'    =>FALSE,
        */
    );

    //缓存配置
    public $cacheSet=array(
        'type'=>'File',//选择缓存：默认为File（无需安装），推荐Apc（需要安装），Memcache等更多缓存请见缓存类库目录
        'expire'        =>3600,//默认缓存时间
        /* file专有设置（不用时请注释掉）*/
        'dir'           =>'',//缓存文件的绝对路径，留空为 TEMP.'/filecache'
        'filename'      =>'data',
        'filesize'      =>'15M',
        'check'         =>false,
        /* memcache专有设置（不用时请注释掉）
        'host'          =>'localhost',
        'port'          =>11211,
        'persistent'    =>'',
        'compressed'    =>FALSE,
        */
    );

    //route解析设置
    public $routeSet=array(
        'search_mode'   =>'rewrite',//三个选择：rewrite（需服务器支持）、pathinfo（需服务器支持）、get（传统方式）
        'search_get'    =>'r', //get字段上的显式方法设置，如http://www.xxx.php?r=index
        'default'       =>'index', //默认模块
        'suffix'        =>'.html', //网址修饰符，使得网址看起来像静态网页，这对搜索引擎友好些
    );

    //数据连接池配置文件的位置
    public $db_ini_file='/config/database.ini.php';

    public function __construct(){
        date_default_timezone_set($this->timezoneSet);//加载时区设置
    }

    public function run(){
        static $isRun;
        if($isRun)return true;
        $isRun=true;
        $this->startSession();
        /******************判断是否为远程浏览器请求（此时非本地命令行请求）******************/
        if(isset($_SERVER['REMOTE_ADDR'])){
            $this->gzipAutoSet and ob_start('gzip');//设置缓冲区压缩方式
            /******************浏览器请求需要发送http头******************/
            oResponse()->addHeader('Content-type','text/html; charset=utf-8')
                ->addHeader('Expires','Sat, 26 Jul 1997 05:00:00 GMT')
                ->addHeader('Last-Modified',gmdate('D, d M Y H:i:s').' GMT')
                ->addHeader('Cache-Control','no-store, no-cache, must-revalidate')
                ->addHeader('Pragma','no-cache');
        }
        //初始化模块，这是最根本的源泉，整个框架诞生后的只需执行一次
        //module::post('index',array('enable'=>true));
        //module::save();
        /****************** 启动路由 ******************/
        try{
            oRouteManager()->dispatch();
        }catch (MonkeyException $e){
            $e->show();
        }catch (exception $_e){
            MonkeyException::halt($_e->getMessage(),$_e->getCode(),$_e->getFile(),$_e->getLine());
        }
        oResponse()->send()->end();
        return true;
    }
    protected function startSession(){
        $session=&$this->sessionSet;
        if($type=$session['type']){
            //$type=ucfirst(strtolower($type));
            !$session['expiry'] and $session['expiry']=ini_get('session.gc_maxlifetime');
            if($type){
                $type='Monkey\\Session\\'.$type;
                call_user_func(array($type,'init'), $session);
                ini_set('session.save_handler', 'user');
                session_set_save_handler(
                    array($type, 'open'),
                    array($type, 'close'),
                    array($type, 'read'),
                    array($type, 'write'),
                    array($type, 'destroy'),
                    array($type, 'gc')
                );
                register_shutdown_function('session_write_close');//修复apc的bug
            }
            session_start();
        }
    }


}